#!/usr/bin/env python3
# @time     :2022/2/21
# @Author   :Simple
# @FileName :auto_make_api_class
import os
from datetime import date

import click

from util.config import api_class_template


@click.command()
@click.argument('path')
def api2class(path):
    """
    根据api文件下存放yaml的文件夹自动生成对应api类
    :param path: 命令行传参path
    :return:
    使用说明：
        在命令行输入: ./auto_make_api_class.py <api路径>
    """
    # 接收代码调用传参path
    auto_make_api_class(path)


def auto_make_api_class(path):
    """
    根据api文件下存放yaml的文件夹自动生成对应api类
    :param path: 存放yaml格式的api主目录
    :return:
    """
    path = os.path.abspath(path)
    # 获取path文件夹下全部子文件和子文件夹
    all_list = os.listdir(path)
    # 给子文件和子文件夹拼接绝对路径
    all_path_list = list(map(lambda f: os.path.join(path, f), all_list))
    # 获取子文件夹
    dir_list = list(filter(lambda f: os.path.isdir(f), all_path_list))
    # 获取子yaml文件
    file_list = list(filter(lambda f: os.path.isfile(f), all_path_list))
    file_list = list(filter(lambda x: x.endswith(".yml") or x.endswith(".yaml"), file_list))
    # 把子yaml文件和文件path，按模板写api类
    if len(file_list) > 0:
        write_template(path, file_list)
    # 递归遍历子文件夹
    for f in dir_list:
        auto_make_api_class(f)


def write_template(case_path, file_list):
    """
    按模板自动生成api类
    :param case_path:
    :param file_list:
    :return:
    """
    # 项目路径
    project_path = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
    print(f"dirname:{os.path.dirname(__file__)}")
    print(f"project:{project_path}")

    # 按api下文件名命名py文件名
    file_name = os.path.split(case_path)[-1]
    file_path = case_path + ".py"

    # 把文件名中'_'去掉，并按首字母大写规则拼接
    temp_list = file_name.split("_")
    class_name = ""
    for l in temp_list:
        class_name = class_name + l.capitalize()

    # key_list：把有绝对路径的yaml文件处理下，只有文件名（无文件格式后缀）
    key_list = list(map(lambda f: os.path.split(f)[-1], file_list))
    key_list = list(map(lambda f: f.split(".")[0], key_list))
    # value_list：把有绝对路径的yaml文件处理下，去掉项目路径
    value_list = list(map(lambda f: f.replace(project_path + '/', ""), file_list))
    print(f"key_list:{key_list}")
    print(f"value_list:{value_list}")

    # 按模板文件创建新api类
    now = date.today()
    with open(api_class_template) as f:
        data = f.read()
        new_data = data.format(class_name=class_name, date=now)
    with open(file_path, "w", encoding="utf-8") as f:
        f.write(new_data)
        for i in range(len(key_list)):
            f.write(f"    {key_list[i]} = '{value_list[i]}'\n")


if __name__ == "__main__":
    api2class()

